package io.sage.ch06.methodrefactoring;

/**
 * 6.5 Introduce Explaining Variable 引入解释性变量
 * 问题场景：有一个复杂的表达式
 * 重构思路：将该表达式（或其中一部分）的结果放进一个临时变量，以此变量名称来解释表达式用途
 * 做法：
 * 1）声明一个final临时变量，将待分解之复杂表达式的一部分动作的运算结果赋值给它。
 * 2）将表达式中的“运算结果”这一部分，替换为上述临时变量。
 * 3）编译，测试
 */
public class IntroduceExplainingVariable {

    private int _quantity;
    private double _itemPrice;

    /**
     * 重构前
     */
    double price() {
        // price is base price - quantity discount + shipping
        return _quantity * _itemPrice -
                Math.max(0, _quantity - 500) * _itemPrice * 0.05 +
                Math.min(_quantity * _itemPrice * 0.1, 100.0);
    }

    /**
     * 重构后
     */
    double price_new() {
        final double basePrice = _quantity * _itemPrice;
        final double quantityDiscount = Math.max(0, _quantity - 500) * _itemPrice * 0.05;
        final double shipping = Math.min(basePrice * 0.1, 100.0);
        return basePrice - quantityDiscount + shipping;
    }
}
